选择排序的基本思想是:如果有N个元素需要排序,那么首先从N个元素中找到最小的那个元素与第0位置上的元素交换(说明一点,如果没有比原本在第0位置上的元素小的就不用交换了,后面的同样是),然后再从剩下的N-1个元素中找到最小的元素与第1位置上的元素交换,之后再从剩下的N-2个元素中找到最小的元素与第2位置上的元素交换,.......直到所有元素都排序好(也就是直到从剩下的2个元素中找到最小的元素与第N-2位置上的元素交换)。
注意,我们的排序有稳定和不稳定之分。稳定排序的意思是:比如原本一组无序的元素中出现两个相同的值,那么经过稳定排序后这两个相等的元素必然相邻,不改变原来无序状态下的先后顺序叫稳定的排序。(不懂我这样说明白了没有,下面给个例子)
那么不稳定排序就是,原本相等的元素之间的顺序经过不稳定的排序后顺序随机,有可能保持原来的,有可能是打乱的。
那么下面我给出具体程序:
void SelectionSort(int a[], int size)
{
for(int i = 0;i < size-1;i++){
//每次循环后将第i小的元素放好
int tempMin = i;
//记录第i个到底size-1个元素中,最小的元素的下标
for(int j = i+1;j < size;j++){
if(z[j] < a[tempMin])
tempMin = j;
}
//下面将第i小的元素放在第i个位置上,并将原来第i个位置的元素挪到后面
int tmp = a[i];
a[i] = a[tempMin];
a[tempMin] = tmp;
}
}
下面分析时间复杂度:外重循环的循环体执行(size-1)次。对于每次外重循环体的执行,第7行內重循环中的j<size这个判断需要执行(size-i)次。由于i从0变到(size-2),因此j<size这个判断一共需要执行2+3+...+size次,即(size+1)*size/2-1次。因此该函数的时间复杂度就是 O(size^2)的。当然,也可以说第7行的j<size这个判断要执行(size+1)*size/2次,因此复杂度就是 O(size^2).